RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
LocalToGlobal (&qd_startPoint);
LocalToGlobal (&qd_endPoint);
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
GlobalToLocal (&qd_startPoint);
GlobalToLocal (&qd_endPoint);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
MoveTo (qd_startPoint.h, qd_startPoint.v);
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_StdRect (GrafVerb verb, const Rect *theRect)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *theRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_StdOval (GrafVerb verb, const Rect *theRect)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *theRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_StdRRect (GrafVerb verb, const Rect *theRect, short ovalWidth, short ovalHeight)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *theRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_StdArc (GrafVerb verb, const Rect *theRect, short startAngle, short arcAngle)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *theRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = (*poly)->polyBBox; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalPoly (poly); // globalize the polygon
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
X_Ray_GlobalToLocalPoly (poly); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalPoly (poly);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
qd_Hilite = LMGetHiliteMode();
GetThemeDrawingState (&qd_curDrawState);
CopyRgn (rgn, qd_drawingRgn); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_StdBits (const BitMap *srcBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *dstRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
if (maskRgn)
SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn); // clip to the specified maskRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, qd_drawingRgn); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_CopyBits (const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
{
unsigned long dummy;
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *dstRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
if (maskRgn)
SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn); // clip to the specified maskRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, (BitMap*)*qd_contPMap, srcRect, dstRect, mode, qd_drawingRgn); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
else if (qd_intersection)
{
if (srcBits == dstBits) // copies to self need extra help to prevent copying the contents of the trans wins
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_CopyDeepMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *dstRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
if (maskRgn)
SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn); // clip to the specified maskRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, (BitMap*)*qd_contPMap, srcRect, maskRect, dstRect, mode, qd_drawingRgn); // do the draw!
UnlockPixels (qd_contPMap);
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
pascal void X_Ray_CopyMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect)
{
if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
{
X_RayDrawLevel++;
GetPort (&qd_origPort);
GetGWorld (&qd_origGWorld, &qd_origGDH);
GetThemeDrawingState (&qd_curDrawState);
qd_drawingRect = *dstRect; // save current draw rect
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
X_Ray_LocalToGlobalRect (&qd_drawingRect); // globalize draw rect
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_drawingRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
X_Ray_GlobalToLocalRect (&qd_drawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
qd_drawingRect.bottom += qd_fInfo.descent + qd_fInfo.leading; // make sure g's and j's don't get clipped
InsetRect (&qd_drawingRect, -2, -2);
RectRgn (qd_drawingRgn, &qd_drawingRect); // determine a region that bounds draw
SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current clipRgn
SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn); // clip draw region to the current visRgn
X_Ray_LocalToGlobalRgn (qd_drawingRgn); // globalize draw region
LocalToGlobal (&qd_startPoint);
qd_transWin = X_Ray_GetWindowRec (qd_origPort); // set up for analyzing how to draw
qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn); // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
if (qd_transWin || qd_intersection)
{
if (qd_transWin) // current port is a transparent window
X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
SetGWorld ((*qd_transWin)->contentBuffer, nil);
SetClip (qd_origPort->clipRgn);
SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetGWorld (qd_origGWorld, qd_origGDH);
}
// draw wasn't to a transparent window, but the draw does intersect a transparent window
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
GlobalToLocal (&qd_startPoint);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
MoveTo (qd_startPoint.h, qd_startPoint.v);
SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
SetEmptyRgn ((*qd_transWin)->transparentUpdateRgn); // remove this transparent update event
GetClip (qd_curClipRgn); // because the real on-screen windows for transparent windows get updated from off screen, the real clipRgns can be "ignored" during updates
// !!! this is actually what makes a window transparent (or clear), the call to CopyDeepMask when mixing the under buffer and content buffer in the mix buffer
DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this draw (in global coordinates) from the overall draw
X_Ray_GlobalToLocalRgn (qd_curDrawRgn); // make everything local to the current underbuffer via the coord system of its real on-screen window
X_Ray_GlobalToLocalRect (&qd_curDrawingRect);
UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post the update for this underBuffer
ClipRect (&(*qd_curUnderPMap)->bounds); // make sure clip is wide open
if (normal)
CopyBits ((BitMap*)*qd_mixPMap, (BitMap*)*qd_curUnderPMap, &qd_drawingRect, &qd_curDrawingRect, srcCopy, qd_curDrawRgn); // note the source rect is qd_drawingRect, which is appropriately local to qd_mixPMap
else
CallUniversalProc (gOldStdBits, kStdBitsProcInfo, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_curDrawingRect, srcCopy, qd_curDrawRgn); // note the source rect is qd_drawingRect, which is appropriately local to qd_mixPMap